package com.sykj.why.mongo.service;

import com.sykj.why.mongo.document.ServiceDocument;
import com.sykj.why.mongo.dto.PageDTO;
import org.springframework.data.mongodb.core.query.Query;

import java.util.List;

/**
 * @program: why
 * @description:
 * @author: hqz
 * @create: 2018-09-06 12:21
 **/
public interface BaseService<T extends ServiceDocument> {
    /**
     * 保存
     * @param entity
     */
    public void save(T entity);

    /**
     *  更新或者保存
     * @param entity
     */
    public void saveOrupdate(T entity);

    /**
     * 删除，逻辑删除
     * @param entity
     */
    public void remove(T entity);

    /**
     * 根据ID删除，物理删除
     * @param entity
     */
    public void delete(T entity);

    /**
     *  查找全部
     * @param cls
     * @return
     */
    @SuppressWarnings("rawtypes")
    public List<T> findAll(Class cls);

    /**
     * 根据条件查询所有数据
     *
     * @param query
     * @param t
     * @return
     */
    public List<T> findAll(Query query, Class<T> t);

    /**
     * 根据删除标记获取所有数据
     *
     * @param t
     * @param removed
     * @return
     */
    public List<T> findAll(Class<T> t, boolean removed);
    /**
     * 去重复查询
     * @param collection
     * @param key
     * @return
     */
    public List<T> findDistinctAll(String collection, String key);


    public int getPageSize(int totalCount, int lineSize);

    /**
     * 根据条件分页查询所有数据
     * @param query
     * @param t
     * @return
     */
    public List<T>findByPage(Query query, int currentPage, int lineSize, Class<T> t);


    /**
     * 根据ID查找
     * @param cls
     * @param id
     * @param removed
     * @return
     */
    @SuppressWarnings("rawtypes")
    public T get(Class cls, String id, boolean removed);

    /**
     * 根据ID查找
     * @param cls
     * @param id
     * @return
     */
    @SuppressWarnings("rawtypes")
    public T get(Class cls, String id);

    /**
     *  一个参数得到相应信息
     * @param fieldName
     * @param getValue
     * @param cls
     * @param removed
     * @return
     */
    @SuppressWarnings("rawtypes")
    public T get(String fieldName, Object getValue, Class cls, boolean removed);

    /**
     * 两个个参数得到相应信息
     * @param fieldNameOne
     * @param getValueOne
     * @param fieldNameTwo
     * @param getValueTwo
     * @param cls
     * @param removed
     * @return
     */
    @SuppressWarnings("rawtypes")
    public T get(String fieldNameOne, Object getValueOne, String fieldNameTwo, Object getValueTwo, Class cls, boolean removed);

    /**
     * 修改
     * @param fieldName
     * @param updatevalue
     * @param id
     * @param entity
     * @return
     */
    @SuppressWarnings("rawtypes")
    public boolean update(String fieldName, Object updatevalue, String id, Class entity);

    /**
     * 修改全部
     * @param fieldName
     * @param updatevalue
     * @param updateId
     * @param id
     * @param entity
     * @return
     */
    @SuppressWarnings("rawtypes")
    public boolean updateAll(String fieldName, Object updatevalue, String updateId, String id, Class entity);

    /**
     * 查询数据的总数
     * @param fieldName
     * @param selRemoved
     * @param entity
     * @return
     */
    @SuppressWarnings("rawtypes")
    public long count(String fieldName, Object selRemoved, Class entity);

    /**
     *  查询数据的总数
     * @param fieldName
     * @param selRemoved
     * @param removed
     * @param entity
     * @return
     */
    @SuppressWarnings("rawtypes")
    public long count(String fieldName, Object selRemoved, boolean removed, Class entity);

    /**
     * 查询数据的总数
     * @param fieldNameOne
     * @param selRemovedOne
     * @param fieldNameTwo
     * @param selRemovedTwo
     * @param removed
     * @param entity
     * @return
     */
    @SuppressWarnings("rawtypes")
    public long count(String fieldNameOne, Object selRemovedOne, String fieldNameTwo, Object selRemovedTwo, boolean removed, Class entity);

    /**
     * 根据条件查询所有的记录的总数
     * @param query
     * @param entity
     * @return
     */
    public long count(Query query, Class<T> entity);



    /**
     * 验证地区给query加值
     * @param t
     * @param query
     * @param flag
     * @return
     */
    Query verifyArea(T t, Query query, int flag);


    Query verifyArea4Pagination(Query query, PageDTO pageDTO);



    /**
     * 验证地区给实体类set地区值,根据传入的实体
     * @param t
     * @return
     */
    public T setAddress(T t);

    /**
     * 验证是否拿到机构Id
     * @param orgId
     * @return
     */
    /*public void verifyOrgId(String orgId);*/

}
